package com.zeus.controller;

import com.github.pagehelper.PageInfo;
import com.zeus.JsonWebToken.JWTUtil;
import com.zeus.pojo.User;
import com.zeus.service.UserService;
import com.zeus.util.JsonObject;
import com.zeus.util.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.*;

/**
 * @author 冯扬龙
 * @date 2021/6/10 12:31
 */
@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 后台：
     * 点击用户管理四个字只是进入service层的方法，要根据条件查询用户是通过mapper的方法，两个
     * 查询是在一起的
     通过用户类型和用户名字来查询对应的用户显示在大屏上,根据条件查询用户
     */
    @RequestMapping("/queryAppointUserAndAllUser")
    @ResponseBody
    public JsonObject queryAppointUserAndAllUser(@RequestParam(defaultValue = "1") int page,
                                  @RequestParam(defaultValue = "15") int pageSize,
                                  User user) {
        PageInfo<User> pageInfo = userService.queryAppointUserAndAllUser(page, pageSize, user);
//        创建跟前端交互的接口,创建返回的对象
        JsonObject object = new JsonObject(0,"ok", pageInfo.getTotal(), pageInfo.getList());
        return object;
    }

    /**
     * 后台：
     增加一个新用户,插入数据到数据库中
     */
    @RequestMapping("/addUser")
    @ResponseBody
    public R addUser(@RequestBody User user) {
        int i = userService.addUser(user);
        if(i > 0){
            return R.ok();
        }else {
            return R.fail("添加失败");
        }
    }

    /**
     * 后台，根据id删除指定的用户并且由于用了String所以可以支持批量删除的功能
     删除指定用户,支持批量删除
     */
    @RequestMapping("deleteUserById")
    @ResponseBody
    public R deleteUserById(String ids) {
//       把接收到的字符串转集合对象
        List<String> list = Arrays.asList(ids.split(","));
        for(String id : list){
            userService.deleteUserById(Integer.parseInt(id));
        }
        return R.ok();
    }

    /**
     * 后台：
     *点击修改密码：
     */
    @RequestMapping("/updatePwd")
    @ResponseBody
    public R updatePwd(@RequestBody  Map<String,String> map) {
        String id = map.get("id");
        String oldPwd = map.get("oldpwd");
        String newPwd = map.get("newpwd");
//        根据id判断当前用户是否存在
        User user = userService.decideById(Integer.parseInt(id));
        if (user.getPassword().equals(oldPwd)) {
//重新设置密码
            User newUser = new User();
            newUser.setId(Integer.parseInt(id));
            newUser.setPassword(newPwd);
            userService.updatePwd(newUser);
            return R.ok();
        } else {
            return R.fail("密码输入错误");
        }
    }


    /**
     前端：
     进入我的模块，我的模块中包括个人发布的招领/寻物信息+对个人的介绍也就是用户的详细信息+
     支持用户对物品信息状态的变更，还可以删除自己发布的信息,还可以编辑个人信息(头像的上传，打赏码)
     这个方法是用户通过点击编辑按钮可以编辑自己的基本资料还可以上传打赏码和头像
     */
    @RequestMapping("/editUser")
    @ResponseBody
    public R editUser(@RequestPart("user") User user ,
                      @RequestParam("upload") MultipartFile upload,
                      @RequestParam( "upload2") MultipartFile upload2,
                      HttpServletRequest request) throws IOException {
        //个人信息的id 后续通过token对象获取
//        long uid=22;//设置
        String token=request.getHeader("token");
        Integer uid= JWTUtil.getUserId(token);
        //设置路径
        String path="E://images/";
        File file=new File(path);
        if(!file.exists()){
            file.mkdirs();
        }
        user.setId(uid);
        if(upload!=null){
            //个人头像
            String filename=upload.getOriginalFilename();
            filename= UUID.randomUUID().toString().replace("-","")+"_"+filename;
            upload.transferTo(new File(path,filename));
            user.setPhoto("/images/"+filename);
        }
        if(upload2!=null){
            //打赏码
            String erwei=upload2.getOriginalFilename();
            erwei= UUID.randomUUID().toString().replace("-","")+"_"+erwei;
            upload2.transferTo(new File(path,erwei));
            user.setRewardCode("/images/"+erwei);
        }

//        //方式2 解决不能不上传情况
//        MultipartHttpServletRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);
//        MultipartFile multipartFile = null;
//        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//        if (isMultipart){
////            MultipartHttpServletRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);
//            multipartFile = multipartRequest.getFile("upload2");
//            String erwei=multipartFile.getOriginalFilename();
//            erwei= UUID.randomUUID().toString().replace("-","")+"_"+erwei;
//            multipartFile.transferTo(new File(path,erwei));
//            user.setRewardCode("/images/"+erwei);
//        }
//
//        MultipartFile multipartFile2 = null;
//        boolean isMultipart2 = ServletFileUpload.isMultipartContent(request);
//        if (isMultipart2){
//            multipartFile2 = multipartRequest.getFile("upload");
//            String filename=multipartFile2.getOriginalFilename();
//            filename= UUID.randomUUID().toString().replace("-","")+"_"+filename;
//            multipartFile2.transferTo(new File(path,filename));
//            user.setPhoto("/images/"+filename);
//        }
        int num=userService.updateData(user);
        if(num>0){
            return R.ok();
        }
        return R.fail("编辑个人信息失败");
    }


    /**
     * 前端：
     * 注册功能：
     注册时用来判断用户名是否已经存在,通过用户名去数据库中匹配，
     已经存在的话就不允许使用相同的名字
     */
    @RequestMapping("/reg")
    @ResponseBody
    public Map toRegist(@RequestBody Map<String,String> map){
        Map m = new HashMap();
        /**
        前端用户输入用户名和密码，这里接收
         */
        String username = map.get("username");
//        通过判断user对象存在还是不存在来判断用户名是否已经被使用
        User user = userService.sureUserExits(username);
        if(user != null){
            m.put("msg","用户已经存在请换一个用户名吧");
            return m;
        }else {
            String password = map.get("password");
        /**
         确认这个用户是没在数据库里的，所以这个时候要把这个用户进行组装然后添加到数据库中
         */
            User user1 = new User();
            user1.setPassword(password);
            user1.setUsername(username);
            user1.setType(0);
            /**
             通过前端的用户名来判断看看是不是已经存在与数据库，不能让名字产生冲突
             */
            int i = userService.addUser(user1);
            if( i > 0){
                m.put("msg","注册成功");
                m.put("code",200);
                return m;
            }else {
                m.put("msg","注册失败，请重新登录");
                return m;
            }

        }

    }

    /**
     * 前端：
     * 用户注册模块，可以进入到修改密码界面修改用户密码，注意不是后台管理页面的密码修改
     * 后台管理是由管理员对密码进行修改，这个是前端用户对自己的密码进行修改
     */
    @RequestMapping("/updatePassword")
    public Map updatePassword(@RequestBody Map<String,String> maps, HttpServletRequest request){
        Map m=new HashMap();
        //获取老密码
        String oldpwd = maps.get("oldpwd");
        String token = request.getHeader("token");
//        通过token获取用户名
        String username = JWTUtil.getUserName(token);
        User users=userService.sureUserExits(username);
        if(!users.getPassword().equals(oldpwd)){
            m.put("msg","输入的原密码不正确,可以重更新修改");
            return m;
        }else {
            String password = maps.get("newpwd");
            //设置包装对象
            User user = new User();
            user.setPassword(password);
            user.setId(users.getId());
            int num = userService.updatePwd(user);
            if (num > 0) {
                m.put("msg", "修改成功，重新登录");
                m.put("code", 200);
                return m;
            } else {
                m.put("msg", "修改失败，请重新修改");
                return m;
            }
        }

    }


}
